#ifndef __BSP_RTC_H
#define __BSP_RTC_H

#include "./SYSTEM/SYS/sys.h"

/* 时间结构体, 包括年月日周时分秒等信息 */
typedef struct
{
    uint8_t hour;       /* 时 */
    uint8_t min;        /* 分 */
    uint8_t sec;        /* 秒 */
    /* 公历年月日周 */
    uint16_t year;      /* 年 */
    uint8_t  month;     /* 月 */
    uint8_t  date;      /* 日 */
    uint8_t  week;      /* 周 */
} _calendar_obj;
extern _calendar_obj calendar;          /* 时间结构体 */

/* ------------------------------------------- 全局变量声明 -------------------------------------------- */

extern RTC_HandleTypeDef g_rtc_handle;  /* RTC控制句柄 */

/* ------------------------------------------- RTC日志配置 -------------------------------------------- */

/* RTC模块日志总开关 - 设置为0可一键关闭所有RTC日志 */
#define RTC_LOG_ENABLE              1

/* RTC模块日志标签 */
#define RTC_LOG_TAG                 "RTC"

#include "elog.h"

/* RTC日志级别控制宏 - 可通过修改这些宏来控制不同级别日志的开启/关闭 */
#define RTC_LOG_ASSERT_ENABLE       1       /* 断言日志开关 */
#define RTC_LOG_ERROR_ENABLE        1       /* 错误日志开关 */
#define RTC_LOG_WARN_ENABLE         1       /* 警告日志开关 */
#define RTC_LOG_INFO_ENABLE         1       /* 信息日志开关 */
#define RTC_LOG_DEBUG_ENABLE        1       /* 调试日志开关 */
#define RTC_LOG_VERBOSE_ENABLE      1       /* 详细日志开关 */

/* RTC日志输出宏定义 */
#if (RTC_LOG_ENABLE && RTC_LOG_ASSERT_ENABLE)
    #define RTC_LOG_A(...)          elog_assert(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_A(...)
#endif

#if (RTC_LOG_ENABLE && RTC_LOG_ERROR_ENABLE)
    #define RTC_LOG_E(...)          elog_error(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_E(...)
#endif

#if (RTC_LOG_ENABLE && RTC_LOG_WARN_ENABLE)
    #define RTC_LOG_W(...)          elog_warn(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_W(...)
#endif

#if (RTC_LOG_ENABLE && RTC_LOG_INFO_ENABLE)
    #define RTC_LOG_I(...)          elog_info(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_I(...)
#endif

#if (RTC_LOG_ENABLE && RTC_LOG_DEBUG_ENABLE)
    #define RTC_LOG_D(...)          elog_debug(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_D(...)
#endif

#if (RTC_LOG_ENABLE && RTC_LOG_VERBOSE_ENABLE)
    #define RTC_LOG_V(...)          elog_verbose(RTC_LOG_TAG, __VA_ARGS__)
#else
    #define RTC_LOG_V(...)
#endif

/* -------------------------------------------- 函数声明 ---------------------------------------------- */

/* 静态函数 */
static uint8_t rtc_is_leap_year(uint16_t year);     /* 判断当前年份是不是闰年 */
static long rtc_date2sec(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);   /* 将年月日时分秒转换成秒钟数 */

/* 接口函数 */
uint8_t rtc_init(void);                             /* 初始化RTC */
void rtc_get_time(void);                            /* 获取RTC时间信息 */
uint16_t rtc_read_bkr(uint32_t bkrx);               /* 读取后备寄存器 */
void rtc_write_bkr(uint32_t bkrx, uint16_t data);   /* 写后备寄存器 */ 
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day);    /* 根据年月日获取星期几 */
uint8_t rtc_set_time(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);   /* 设置时间 */
uint8_t rtc_set_alarm(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);  /* 设置闹钟时间 */

#endif
